home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
minix
/
up1510b.tgz
/
up1510b
/
src
/
commands
/
ic
/
ic_input.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-23
|
5KB
|
278 lines
/****************************************************************/
/* */
/* ic_input.c */
/* */
/* Character input routines for the */
/* "Integer Calculator". */
/* */
/****************************************************************/
/* origination 1988-Apr-7 Terrence W. Holm */
/* added cmd line args 1988-May-13 Terrence W. Holm */
/****************************************************************/
#include <stdio.h>
#include <ctype.h>
#include <sgtty.h>
#include "ic.h"
static struct sgttyb saved_mode;
static struct tchars saved_chars;
/****************************************************************/
/* */
/* Save_Term() */
/* */
/* Save the current terminal characteristics. */
/* */
/****************************************************************/
Save_Term()
{
ioctl( 0, TIOCGETP, &saved_mode );
ioctl( 0, TIOCGETC, (struct sgttyb *) &saved_chars );
}
/****************************************************************/
/* */
/* Set_Term() */
/* */
/* Set up the terminal characteristics for ic. */
/* */
/****************************************************************/
Set_Term()
{
struct sgttyb ic_mode;
struct tchars ic_chars;
ic_mode = saved_mode;
ic_chars = saved_chars;
/* No tab expansion, no echo, cbreak mode */
ic_mode.sg_flags = ic_mode.sg_flags & ~XTABS & ~ECHO | CBREAK;
/* Change the interrupt character to ^C, ignore ^S & ^Q */
ic_chars.t_intrc = '\003';
ic_chars.t_startc = '\377';
ic_chars.t_stopc = '\377';
ioctl( 0, TIOCSETP, &ic_mode );
ioctl( 0, TIOCSETC, (struct sgttyb *) &ic_chars );
}
/****************************************************************/
/* */
/* Reset_Term() */
/* */
/* Restore the terminal characteristics. */
/* */
/****************************************************************/
Reset_Term()
{
ioctl( 0, TIOCSETP, &saved_mode );
ioctl( 0, TIOCSETC, (struct sgttyb *) &saved_chars );
}
/****************************************************************/
/* */
/* Get_Char() */
/* */
/* Return the next input character. Upper case */
/* is mapped to lower case. Escape sequences */
/* are mapped to special codes (msb set). */
/* */
/****************************************************************/
int Get_Char()
{
int c;
/* fflush() used because Minix does not automatically */
/* flush the output. */
fflush( stdout );
if ( (c = Getc()) == EOF )
return( EOF );
c &= 0x7f;
if ( isupper(c) )
return( tolower(c) );
if ( c == ESCAPE )
if ( (c=Getc()) != '[' )
{
ungetc( c, stdin );
return( ESCAPE );
}
else
{
c = Getc() | 0x80;
if ( c == ESC_HOME || c == ESC_UP || c == ESC_PGUP ||
c == ESC_LEFT || c == ESC_5 || c == ESC_RIGHT ||
c == ESC_END || c == ESC_DOWN || c == ESC_PGDN ||
c == ESC_PLUS || c == ESC_MINUS )
return( c );
else
return( ESCAPE );
}
return( c );
}
/****************************************************************/
/* */
/* Init_Getc( argc, argv ) */
/* */
/* Give Getc() references to the command line */
/* arguments. */
/* */
/****************************************************************/
static int args_remaining;
static char **args_pointer;
static int args_index;
Init_Getc( argc, argv )
int argc;
char *argv[];
{
args_remaining = argc - 1;
args_pointer = &argv[1];
args_index = 0;
}
/****************************************************************/
/* */
/* Getc() */
/* */
/* Get the next input character from the command */
/* line if there is some more, else from stdin. */
/* */
/****************************************************************/
int Getc()
{
int c;
if ( args_remaining > 0 )
if ( (c = args_pointer[ 0 ][ args_index++ ]) == '\0' )
{
--args_remaining;
++args_pointer;
args_index = 0;
if ( args_remaining > 0 )
return( '\n' );
}
else
return( c );
return( getchar() );
}
/****************************************************************/
/* */
/* Get_Base( character ) */
/* */
/* Return an appropriate base number for the */
/* given character code. Used by 'i' and 'o'. */
/* */
/****************************************************************/
int Get_Base( code )
char code;
{
switch ( code )
{
case 'h' : return( HEXADECIMAL );
case 'd' : return( DECIMAL );
case 'o' : return( OCTAL );
case 'b' : return( BINARY );
case 'a' : return( ASCII );
default : return( ERROR );
}
}